// 给你二叉树的根结点 root ，请你将它展开为一个单链表：

// 展开后的单链表应该同样使用 TreeNode ，其中 right 子指针指向链表中下一个结点，而左子指针始终为 null 。
// 展开后的单链表应该与二叉树 先序遍历 顺序相同。

// 来源：力扣（LeetCode）
// 链接：https://leetcode-cn.com/problems/flatten-binary-tree-to-linked-list
// 著作权归领扣网络所有。商业转载请联系官方授权，非商业转载请注明出处。

// 看了题解，指针不太会用，思路没问题

// 执行用时：
// 8 ms
// , 在所有 C++ 提交中击败了
// 63.10%
// 的用户
// 内存消耗：
// 12.7 MB
// , 在所有 C++ 提交中击败了
// 16.64%
// 的用户
#include<bits/stdc++.h>
#include<string>
#include<vector>
#include<unordered_map>
#include<set>
#include<queue>
using namespace std;

struct TreeNode {
     int val;
     TreeNode *left;
     TreeNode *right;
     TreeNode() : val(0), left(nullptr), right(nullptr) {}
     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
};


class Solution {
public:
    vector<TreeNode*> res;
    void dfs(TreeNode* root){
        if(root == NULL){
            return;
        }
        res.push_back(root);
        dfs(root->left);
        dfs(root->right);
    }

    void flatten(TreeNode* root) {
        dfs(root);
        for(int i=1;i<res.size();i++){
            TreeNode* temp = res[i-1];
            TreeNode* cur = res[i];
            temp ->right = cur;
            temp ->left = nullptr;
        }
    }
};